home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / glib-2.0 / glib / gmacros.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-04-25  |  8.2 KB  |  252 lines

  1. /* GLIB - Library of useful routines for C programming
  2.  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the
  16.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  17.  * Boston, MA 02111-1307, USA.
  18.  */
  19.  
  20. /*
  21.  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
  22.  * file for a list of people on the GLib Team.  See the ChangeLog
  23.  * files for a list of changes.  These files are distributed with
  24.  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
  25.  */
  26.  
  27. /* This file must not include any other glib header file and must thus
  28.  * not refer to variables from glibconfig.h 
  29.  */
  30.  
  31. #ifndef __G_MACROS_H__
  32. #define __G_MACROS_H__
  33.  
  34. /* We include stddef.h to get the system's definition of NULL
  35.  */
  36. #include <stddef.h>
  37.  
  38. /* Here we provide G_GNUC_EXTENSION as an alias for __extension__,
  39.  * where this is valid. This allows for warningless compilation of
  40.  * "long long" types even in the presence of '-ansi -pedantic'. 
  41.  */
  42. #if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
  43. #  define G_GNUC_EXTENSION __extension__
  44. #else
  45. #  define G_GNUC_EXTENSION
  46. #endif
  47.  
  48. /* Provide macros to feature the GCC function attribute.
  49.  */
  50. #if    __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
  51. #define G_GNUC_PURE                            \
  52.   __attribute__((__pure__))
  53. #define G_GNUC_MALLOC                \
  54.   __attribute__((__malloc__))
  55. #else
  56. #define G_GNUC_PURE
  57. #define G_GNUC_MALLOC
  58. #endif
  59.  
  60. #if     __GNUC__ >= 4
  61. #define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
  62. #else
  63. #define G_GNUC_NULL_TERMINATED
  64. #endif
  65.  
  66. #if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
  67. #define G_GNUC_PRINTF( format_idx, arg_idx )    \
  68.   __attribute__((__format__ (__printf__, format_idx, arg_idx)))
  69. #define G_GNUC_SCANF( format_idx, arg_idx )     \
  70.   __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
  71. #define G_GNUC_FORMAT( arg_idx )                \
  72.   __attribute__((__format_arg__ (arg_idx)))
  73. #define G_GNUC_NORETURN                         \
  74.   __attribute__((__noreturn__))
  75. #define G_GNUC_CONST                            \
  76.   __attribute__((__const__))
  77. #define G_GNUC_UNUSED                           \
  78.   __attribute__((__unused__))
  79. #define G_GNUC_NO_INSTRUMENT            \
  80.   __attribute__((__no_instrument_function__))
  81. #else   /* !__GNUC__ */
  82. #define G_GNUC_PRINTF( format_idx, arg_idx )
  83. #define G_GNUC_SCANF( format_idx, arg_idx )
  84. #define G_GNUC_FORMAT( arg_idx )
  85. #define G_GNUC_NORETURN
  86. #define G_GNUC_CONST
  87. #define G_GNUC_UNUSED
  88. #define G_GNUC_NO_INSTRUMENT
  89. #endif  /* !__GNUC__ */
  90.  
  91. #if    __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
  92. #define G_GNUC_DEPRECATED                            \
  93.   __attribute__((__deprecated__))
  94. #else
  95. #define G_GNUC_DEPRECATED
  96. #endif /* __GNUC__ */
  97.  
  98. /* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
  99.  * macros, so we can refer to them as strings unconditionally.
  100.  * usage not-recommended since gcc-3.0
  101.  */
  102. #if defined (__GNUC__) && (__GNUC__ < 3)
  103. #define G_GNUC_FUNCTION         __FUNCTION__
  104. #define G_GNUC_PRETTY_FUNCTION  __PRETTY_FUNCTION__
  105. #else   /* !__GNUC__ */
  106. #define G_GNUC_FUNCTION         ""
  107. #define G_GNUC_PRETTY_FUNCTION  ""
  108. #endif  /* !__GNUC__ */
  109.  
  110. #define G_STRINGIFY(macro_or_string)    G_STRINGIFY_ARG (macro_or_string)
  111. #define    G_STRINGIFY_ARG(contents)    #contents
  112.  
  113. /* Provide a string identifying the current code position */
  114. #if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus)
  115. #  define G_STRLOC    __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
  116. #else
  117. #  define G_STRLOC    __FILE__ ":" G_STRINGIFY (__LINE__)
  118. #endif
  119.  
  120. /* Provide a string identifying the current function, non-concatenatable */
  121. #if defined (__GNUC__)
  122. #  define G_STRFUNC     ((const char*) (__PRETTY_FUNCTION__))
  123. #elif defined (G_HAVE_ISO_VARARGS)
  124. #  define G_STRFUNC     ((const char*) (__func__))
  125. #else
  126. #  define G_STRFUNC     ((const char*) ("???"))
  127. #endif
  128.  
  129. /* Guard C code in headers, while including them from C++ */
  130. #ifdef  __cplusplus
  131. # define G_BEGIN_DECLS  extern "C" {
  132. # define G_END_DECLS    }
  133. #else
  134. # define G_BEGIN_DECLS
  135. # define G_END_DECLS
  136. #endif
  137.  
  138. /* Provide definitions for some commonly used macros.
  139.  *  Some of them are only provided if they haven't already
  140.  *  been defined. It is assumed that if they are already
  141.  *  defined then the current definition is correct.
  142.  */
  143. #ifndef NULL
  144. #  ifdef __cplusplus
  145. #    define NULL        (0L)
  146. #  else /* !__cplusplus */
  147. #    define NULL        ((void*) 0)
  148. #  endif /* !__cplusplus */
  149. #endif
  150.  
  151. #ifndef    FALSE
  152. #define    FALSE    (0)
  153. #endif
  154.  
  155. #ifndef    TRUE
  156. #define    TRUE    (!FALSE)
  157. #endif
  158.  
  159. #undef    MAX
  160. #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
  161.  
  162. #undef    MIN
  163. #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
  164.  
  165. #undef    ABS
  166. #define ABS(a)       (((a) < 0) ? -(a) : (a))
  167.  
  168. #undef    CLAMP
  169. #define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
  170.  
  171. /* Count the number of elements in an array. The array must be defined
  172.  * as such; using this with a dynamically allocated array will give
  173.  * incorrect results.
  174.  */
  175. #define G_N_ELEMENTS(arr)        (sizeof (arr) / sizeof ((arr)[0]))
  176.  
  177. /* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT
  178.  */
  179. #define GPOINTER_TO_SIZE(p)    ((gsize) (p))
  180. #define GSIZE_TO_POINTER(s)    ((gpointer) (gsize) (s))
  181.  
  182. /* Provide convenience macros for handling structure
  183.  * fields through their offsets.
  184.  */
  185. #define G_STRUCT_OFFSET(struct_type, member)    \
  186.     ((glong) ((guint8*) &((struct_type*) 0)->member))
  187. #define G_STRUCT_MEMBER_P(struct_p, struct_offset)   \
  188.     ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
  189. #define G_STRUCT_MEMBER(member_type, struct_p, struct_offset)   \
  190.     (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
  191.  
  192. /* Provide simple macro statement wrappers (adapted from Perl):
  193.  *  G_STMT_START { statements; } G_STMT_END;
  194.  *  can be used as a single statement, as in
  195.  *  if (x) G_STMT_START { ... } G_STMT_END; else ...
  196.  *
  197.  *  For gcc we will wrap the statements within `({' and `})' braces.
  198.  *  For SunOS they will be wrapped within `if (1)' and `else (void) 0',
  199.  *  and otherwise within `do' and `while (0)'.
  200.  */
  201. #if !(defined (G_STMT_START) && defined (G_STMT_END))
  202. #  if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
  203. #    define G_STMT_START    (void) __extension__ (
  204. #    define G_STMT_END        )
  205. #  else
  206. #    if (defined (sun) || defined (__sun__))
  207. #      define G_STMT_START    if (1)
  208. #      define G_STMT_END    else (void)0
  209. #    else
  210. #      define G_STMT_START    do
  211. #      define G_STMT_END    while (0)
  212. #    endif
  213. #  endif
  214. #endif
  215.  
  216. /* Allow the app programmer to select whether or not return values
  217.  * (usually char*) are const or not.  Don't try using this feature for
  218.  * functions with C++ linkage.
  219.  */
  220. #ifdef G_DISABLE_CONST_RETURNS
  221. #define G_CONST_RETURN
  222. #else
  223. #define G_CONST_RETURN const
  224. #endif
  225.  
  226. /*
  227.  * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to 
  228.  * the compiler about the expected result of an expression. Some compilers
  229.  * can use this information for optimizations.
  230.  *
  231.  * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when
  232.  * putting assignments in g_return_if_fail ().  
  233.  */
  234. #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
  235. #define _G_BOOLEAN_EXPR(expr)                   \
  236.  __extension__ ({                               \
  237.    int _g_boolean_var_;                         \
  238.    if (expr)                                    \
  239.       _g_boolean_var_ = 1;                      \
  240.    else                                         \
  241.       _g_boolean_var_ = 0;                      \
  242.    _g_boolean_var_;                             \
  243. })
  244. #define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))
  245. #define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
  246. #else
  247. #define G_LIKELY(expr) (expr)
  248. #define G_UNLIKELY(expr) (expr)
  249. #endif
  250.  
  251. #endif /* __G_MACROS_H__ */
  252.